Repository navigation
Conversation
…hness Three metrics of a one-channel SignalObj in Pa, each returning a dict of floats and NumPy arrays: - loudness_zwicker: ISO 532-1:2017, stationary and time-varying methods, free or diffuse field. N (sone), LN (phon), the specific loudness over 240 steps of 0.1 Bark and, time-varying, N(t), LN(t) and N'(t) every 2 ms with Nmax and N5. Port of SQAT's Loudness_ISO532_1 (BSD-3, Ella Manor's AARAE code after the C code of the standard). Signals not at 48 kHz are resampled as MATLAB's resample does (matches it to 2e-15). - sharpness_din45692: DIN 45692:2009, Formula (1) on that specific loudness, k = 0.11; S, or S(t) and S50 for the time-varying method. Written from the standard. - roughness_daniel1997: Daniel and Weber (1997), R(t), R'(t) over 47 half-Bark channels and Rmean (asper). Port of SQAT's Roughness_Daniel1997 (MIT, Dik Hermes et al.). The BSD-3 and MIT notices of the ported files are in the module header. Validation. Against SQAT on golden data from tests/golden/make_loudness_sqat.m and make_roughness_sqat.m (MATLAB R2026b, same float32 samples): stationary loudness within 3e-13, time- varying within 3.1e-8 sone (the nonlinear decay amplifies 3e-14 of filter rounding on the decay of a burst), roughness within 2.8e-5 asper (FFT rounding, 32 kHz input). ISO 532-1 Annex B: signal 1 (band levels) 83.2957 sone against 83.296; the standard's files of signals 2 to 5 within 0.034 sone (0.26 %); signals 6 to 25 keep N(t) within 5 % or 0.1 sone at every frame, max deviation 0.068 sone. DIN 45692: the 41 test signals of Tables A.2 and A.3 within 0.45 of the tolerance (worst 10.5 kHz band, -0.19 acum), reference noise 1.02 acum. 1 kHz at 40 dB gives 0.999976 sone; the reference AM tone 1.000001 asper. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
tonality_aures1985(signal, field='free', time_skip=0.0) gives the tonality K(t) and its mean in tonality units: the tonal components of Terhardt, Stoll and Seewann (1982) in Hann frames of 160 ms, weighted by bandwidth, frequency and level excess, and the loudness ratio WGr of the signal without and with them (Aures 1985). It is written from the two papers. SQAT's Tonality_Aures1985 is GPL-3.0 and served only as the test oracle. The private helper of the Terhardt excitation is shared with the roughness port, whose parity with SQAT is unchanged. Tests check the unit (a 1 kHz tone at 60 dB is 1 t.u.), the level excess weighting against its formula, parity with SQAT on golden data from tests/golden/make_tonality_sqat.m (tones within 3.4e-5 t.u., a tone in noise within 0.012 t.u.) and the rejection of invalid input. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…oacoustics fluctuation_strength_osses2016(signal, time_skip=0.0) gives FS(t) every 0.2 s over frames of 2 s, the specific fluctuation strength over 47 half-Bark channels and the mean FSmean, in vacil, after Osses, Garcia and Kohlrausch (2016): the roughness model of Daniel and Weber with frames of 2 s, a modulation weighting H(fmod), the generalised modulation depth compressed above 0.7 and FS = C_FS sum (m*)^1.7 |k k|^1.7 g(z). It is written from the paper. SQAT's FluctuationStrength_Osses2016 and its H(fmod) data are GPL-3.0 and served only as the test oracle. The paper does not give the filter type of H(fmod), so its cut-offs (1.75 and 13.5 Hz) were fitted to the AM tones of the paper's Table 1. The result differs from SQAT, as the docstring states: within 1 % for AM tones at 4 Hz, 4 % at 16 Hz, 14 % above for an FM tone, and about half of SQAT's value for AM at 1 Hz. Tests check the unit (1 vacil for the reference AM tone), the AM tones of Table 1 (rms deviation 0.09 vacil), the comparison with SQAT on golden data from tests/golden/make_fluctuation_sqat.m with the tolerances above, and the rejection of invalid input. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…to pytta.psychoacoustics sharpness_din45692 gets weighting='din', 'aures' or 'bismarck': the weightings of Aures (which depends on the total loudness) and of von Bismarck, Formulae (B.1) and (B.2) of DIN 45692, Annex B, with the same k = 0.11, as SQAT and the MATLAB acousticSharpness that the ITA-Toolbox calls offer. loudness_level and loudness_from_level convert between sone and phon by ISO 532-1, Formulae (1) to (3), as ita_sone2phon. critical_band gives the critical band rate and bandwidth of Zwicker and Terhardt (1980), with the band edges, as ita_freq2cb (which squares the arctangent of the second term of the rate; the docstring says so). Tests check that von Bismarck equals DIN when no loudness lies above 15 Bark, parity of the three weightings with SQAT on golden data from tests/golden/make_sharpness_weights_sqat.m (within 3.6e-15 acum), the loudness level formulae and their inverse, and the critical band at 1 kHz and against the table of Zwicker. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This was referenced Oct 31, 2026
aguirreSL
added a commit
to aguirreSL/PyTTa
that referenced
this pull request
Nov 1, 2026
…PyTTaMaster#111 by hand Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Builds on #92 (and so on #91 and #79), so until those are merged this pull request also shows their commits.
Adds three things to
pytta.psychoacoustics, from the psychoacoustics of the ITA-Toolbox (ita_psychoacoustic_sharpness,ita_sone2phonandita_freq2cb):sharpness_din45692(..., weighting='din')also takes'aures'and'bismarck': the weightings of Aures, which depends on the total loudness N, and of von Bismarck, Formulae (B.1) and (B.2) of the informative Annex B of DIN 45692, with the same k = 0.11. SQAT uses k = 0.11 for all three as well. The standard asks to label each result with its method (S, S_A or S_B).loudness_level(N)andloudness_from_level(LN): sone to phon and back, ISO 532-1:2017, Formulae (1) to (3). Below 1 sone,loudness_zwickerkeeps reporting LN as the program of Annex A of the standard does (40 N^0.35, at least 3 phon), which differs from Formula (3) by 0.01 phon at 0.5 sone. The docstring states this.critical_band(f): the critical band rate and bandwidth of Zwicker and Terhardt (1980), with the band edges (f_low f_high = f², f_high - f_low = Δf).ita_freq2cbsquares the arctangent of the second term of the rate, which gives 0.6 Bark less at 8 kHz. This function uses the expression of the paper, already used by the tonality.The weightings are written from the text of DIN 45692. SQAT's
Sharpness_DIN45692is GPL-3.0 and served only as the test oracle.The tests in
tests/test_psychoacoustics.pyprint the measured differences:tests/golden/make_sharpness_weights_sqat.m(MATLAB R2026b, same float32 samples): six band noises from 40 dB to 80 dB, with the three weightings, agree within 3.6e-15 acum.Checked with Python 3.12, numpy 1.26 and scipy 1.17. The 7 failures of
development(3 intest_h5io.py, 4 intest_pyttasave.py) are the same with and without this change.Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com